<?php

class Roles_IndexController extends Zend_Controller_Action {
	private $nav;
	
	public function init() {
		$this->nav = new App_Util_Navegacion();
		$this->nav->agregar_navegacion( "Listado de roles", "/roles/index/lista", "Listado de roles" );
	}
	
	public function indexAction() {
		$this->_forward("lista");
	}
	
	public function listaAction() {
	      $this->view->nav = $this->nav;
		
		/*$modo = $this->_getParam('modo');
		
		if(1==$modo){
			$this->_helper->layout->disableLayout();
		}
		*/
		$roles = new Roles_Model_Roles ( );
		$arrRoles = $roles->getRoles ();
		$this->view->arrRoles = $arrRoles;
		
//		$Usuarios = new Usuarios_Model_Usuarios();
//		$arrCountUsuariosPorRol=$Usuarios->getArrayCountUsuariosRolAsignados();
//		$this->view->arrCountUsuariosPorRol=$arrCountUsuariosPorRol;
				
		$this->view->roles = array (1 => "Administrador", 2 => "Par acad&eacute;mico" );
	}
	
	/**
	 * Crea el registro de un rol dentro del sistema
	 */
	public function crearAction() {
		
		$tupla_seleccionados = $this->_getParam ( 'codigos', "" );
		$arreglo_seleccionados = array();
		if (!empty($tupla_seleccionados)) {
			$arreglo_seleccionados = explode ( ",", $tupla_seleccionados );
		}
		
		$this->nav->agregar_navegacion("Crear rol", "","Crear rol");
		$this->view->nav = $this->nav;
		
		$form = new Roles_Form_Rol ( );
		$form->getElement("codpadre")->setIgnore(true);//tomar en cuenta para perfiles
		$roles = new Roles_Model_Roles ( );

		$Perfilrol = new Roles_Model_Perfilrol ( );
		if ($this->getRequest()->isPost() && $form->isValid( $this->getRequest()->getPost () )) {
			try {
				if (count($arreglo_seleccionados)==0) {
					throw new Exception("Seleccione por lo menos una funcionalidad para este rol");
				}
				$codrol = $roles->guardarRol( $form->getValues () );
				$this->view->priorityMessenger("Los datos se han guardado correctamente","success");
				
				$Perfilrol->guardarPerfilRol ( $codrol, $arreglo_seleccionados );
				$this->_helper->redirector("lista");
			} catch (Exception $e) {
				$this->view->priorityMessenger($e->getMessage(),"error");
			}
		}
		$this->view->form = $form;
	}
	
	public function modificarAction() {
		$this->nav->agregar_navegacion("Modificar rol", "","Modificar rol");
		$this->view->nav = $this->nav;
	    
		$codrol = $this->_getParam ( 'codrol' );
		if ($codrol === null) {
			$this->_helper->redirector("lista");
		}
		$this->view->codrol = $codrol;
		
		$tupla_seleccionados = $this->_getParam ( 'codigos', null );
		$arreglo_seleccionados = array();
		if (!empty($tupla_seleccionados)) {
			$arreglo_seleccionados = explode ( ",", $tupla_seleccionados );
		}
//		Zend_Debug::dump($tupla_seleccionados,"LA TUPLA");
//		Zend_Debug::dump($arreglo_seleccionados,"LO QUE VIENE");
		
		$form = new Roles_Form_Rol ( );
		$form->getElement("codpadre")->setIgnore(true);//tomar en cuenta para perfiles
		$roles = new Roles_Model_Roles ( );
		
		if ($this->getRequest()->isPost() && $form->isValid( $this->getRequest()->getPost () )) {
			
			$Perfilrol = new Roles_Model_Perfilrol ( );
			try {
				if (count($arreglo_seleccionados)==0) {
					throw new Exception("Seleccione por lo menos una funcionalidad para este rol");
				}
				$roles->guardarRol( $form->getValues () );
				$this->view->priorityMessenger("Los datos se han guardado correctamente","success");
			
				//Esto agrega los padres de los perfiles seleccionados
				$arr_codpadres = array ();
				$arr_base = $arreglo_seleccionados;
				$seccionfuncional = new Roles_Model_Seccionfuncional ( );
				foreach ( $arreglo_seleccionados as $indice => $codigo ) {
					$seccionfuncional->arregloPadres ( $codigo, $arr_codpadres );
					$arr_base = array_merge ( $arr_base, $arr_codpadres );
				}
				$arreglo_seleccionados = array_unique ( $arr_base );
//				Zend_Debug::dump($arreglo_seleccionados,"LO QUE QUEDA");
				$Perfilrol->guardarPerfilRol ( $codrol, $arreglo_seleccionados );
				
			} catch (Exception $e) {
				$this->view->priorityMessenger($e->getMessage(),"error");
			}
		} else {
			$datos = $roles->cargarDatos ( $codrol );
			$form->populate ( $datos );
		}
		$this->view->form = $form;
//		exit();
		$this->_helper->viewRenderer->setRender("crear");
	}
	
	public function eliminarAction() {
		$codrol = $this->_getParam ( 'codrol' );
		/*
		$Perfilrol = new Roles_Model_Perfilrol ( );
		$Perfilrol->eliminar ( $codrol );
		
		$Rolesusuarios = new Usuarios_Model_Rolesusuarios();
		$Rolesusuarios->eliminar($codrol);
		*/
		$Roles = new Roles_Model_Roles();
		$Roles->eliminar($codrol);
		$this->_helper->redirector("lista");
	}
	
	public function usuariosrolAction(){
		
		$codrol = $this->_getParam ( 'codrol' );
		
		$codrol 			 = $this->_getParam ( 'codrol' );//Llega por URL
		$roles 		= new Roles_Model_Roles ( );
		$Perfilrol 	= new Roles_Model_Perfilrol ( );
		//Obtencion del rol asociado para presentacion de navegacion
		$Rol	= $roles->getRol($codrol);
		//Barra de Navegacion
		$params=App_Util_SafeUrl::encriptar(array("codrol"=>$Rol["codpadre"]),true);
		$RolPadre = $roles->getRol($Rol["codpadre"]);
		
		$nav = new App_Util_Navegacion ( );
		$nav->agregar_navegacion ( "Listado de roles", "/roles/index/lista", "Listado de roles" );
			$nav->agregar_navegacion("Listado perfiles :: {$RolPadre["nombrerol"]}","/roles/index/perfilesrol/{$params}","Listado perfiles");
		$nav->agregar_navegacion ( "Usuarios por rol", "", "Usuarios por rol" );
		$this->view->placeholder("navegacion")->set($this->view->navegacion($nav));
		
		$Usuarios = new Usuarios_Model_Usuarios();
		$arrUsuariosRol=$Usuarios->getArregloUsuariosRol($codrol);
		$this->view->arrUsuariosRol = $arrUsuariosRol;
		
	}
	
	//AQUI VIENEN ACCIONES RELACIONADAS CON PERFILES (HIJOS DE ROLES) ASOCIADOS A ROLES
	public function perfilesrolAction(){
		$codrol = $this->_getParam ( 'codrol' );
		if ($codrol === null) {
			$this->_helper->redirector("lista");
		}
		$this->view->codrol=$codrol;
		$roles = new Roles_Model_Roles ( );
		$nombreRol=$roles->getRol($codrol);
		$this->view->nombreRol=$nombreRol["nombrerol"];

		$nav = new App_Util_Navegacion ( );
		$nav->agregar_navegacion("Listado de roles", "/roles/index/lista","Listado de roles");
		$nav->agregar_navegacion("Listado perfiles :: {$nombreRol["nombrerol"]}","","Listado perfiles");
		$this->view->placeholder("navegacion")->set($this->view->navegacion($nav));
		
		$Perfiles = $roles->getPerfiles($codrol);
		$this->view->Perfiles = $Perfiles;
		
		$Roles=$roles->getRoles();
		$nombreRoles=array();
		foreach ($Roles as $key => $value){
			$nombreRoles[$value["codrol"]]=$value["nombrerol"];
		}
		$this->view->Roles=$nombreRoles;
		
		$Usuarios = new Usuarios_Model_Usuarios();
		$arrCountUsuariosPorRol=$Usuarios->getArrayCountUsuariosRolAsignados();
		$this->view->arrCountUsuariosPorRol=$arrCountUsuariosPorRol;
		
	}

	/**
	 * Crea el registro de un perfil dentro del sistema
	 */
	public function crearperfilAction() {
		//Recepcion de variables URL
		$codpadre 			 = $this->_getParam ( 'codpadre' );//Llega por URL
		$tupla_seleccionados = $this->_getParam ( 'codigos', "" );//Llega por POST, luego se valida en POST
		if ($codpadre === null) {
			$this->_helper->redirector("lista");
		}
		$arreglo_seleccionados = array();
		if (!empty($tupla_seleccionados)) {
			$arreglo_seleccionados = explode ( ",", $tupla_seleccionados );//La validacion se hace en POST ver adelante
		}
		$this->view->codpadre=$codpadre;
		//Instanciacion de clases a usar en el controlador
		$roles 		= new Roles_Model_Roles ( );
		$form 		= new Roles_Form_Rol ( );
		$Perfilrol 	= new Roles_Model_Perfilrol ( );
		//Obtencion del rol asociado para presentacion de navegacion
		$nombreRol	= $roles->getRol($codpadre);
		//Barra de Navegacion
		$paramsNav=App_Util_SafeUrl::encriptar(array("codrol"=>$codpadre),true);
		$nav = new App_Util_Navegacion ( );
		$nav->agregar_navegacion("Listado de roles", "/roles/index/lista","Listado de roles");
		$nav->agregar_navegacion("Listado perfiles :: {$nombreRol["nombrerol"]}","/roles/index/perfilesrol/{$paramsNav}","Listado perfiles");
		$nav->agregar_navegacion("Crear perfil", "", "Crear perfil" );
		$this->view->placeholder("navegacion")->set($this->view->navegacion($nav));
		//Seteo de elementos del formulario
		$form->getElement("nombrerol")->setLabel("Nombre perfil:");
		$form->getElement("codpadre")->setValue($codpadre);
		//Validacion POST
		if ($this->getRequest()->isPost() && $form->isValid( $this->getRequest()->getPost () )) {
			try {
				if (count($arreglo_seleccionados)==0) {
					throw new Exception("Seleccione por lo menos una funcionalidad para este perfil");
				}
				//Zend_Debug::dump($form->getValues ());
				$codrol = $roles->guardarRol( $form->getValues () );
				$this->view->priorityMessenger("Los datos se han guardado correctamente","success");
				
				//Esto agrega los padres de los perfiles seleccionados
				$arr_codpadres = array ();
				$arr_base = $arreglo_seleccionados;
				$seccionfuncional = new Roles_Model_Seccionfuncional ( );
				foreach ( $arreglo_seleccionados as $indice => $codigo ) {
					$seccionfuncional->arregloPadres ( $codigo, $arr_codpadres );
					$arr_base = array_merge ( $arr_base, $arr_codpadres );
				}
				$arreglo_seleccionados = array_unique ( $arr_base );
				//Se guardan los perfiles seleccionados
				$Perfilrol->guardarPerfilRol ( $codrol, $arreglo_seleccionados );
				$params=App_Util_SafeUrl::encriptar(array("codrol"=>$codpadre));
				$this->_helper->redirector( "perfilesrol","index","roles",$params);
			} catch (Exception $e) {
				$this->view->priorityMessenger($e->getMessage(),"error");
			}
		}
		$this->view->form = $form;
	}
	
	public function modificarperfilAction() {
		//Recepcion de variables URL
		$codrol 			 = $this->_getParam ( 'codrol' );//Llega por URL
		$tupla_seleccionados = $this->_getParam ( 'codigos', null );//Llega por POST
		if ($codrol === null) {
			$this->_helper->redirector("lista");
		}
		$arreglo_seleccionados = array();
		if (!empty($tupla_seleccionados)) {
			$arreglo_seleccionados = explode ( ",", $tupla_seleccionados );
		}
		//Instanciacion de clases a usar en el controlador
		$roles 		= new Roles_Model_Roles ( );
		$form 		= new Roles_Form_Rol ( );
		$Perfilrol 	= new Roles_Model_Perfilrol ( );
		//Obtencion del rol asociado para presentacion de navegacion
		$Rol	= $roles->getRol($codrol);
		$this->view->codigo   = $codrol;
		$this->view->codpadre = $Rol["codpadre"];
		//Barra de Navegacion
		$params=App_Util_SafeUrl::encriptar(array("codrol"=>$Rol["codpadre"]),true);
		$RolPadre = $roles->getRol($Rol["codpadre"]);
		$nav = new App_Util_Navegacion ( );
		$nav->agregar_navegacion("Listado de roles", "/roles/index/lista","Listado de roles");
		$nav->agregar_navegacion("Listado perfiles :: {$RolPadre["nombrerol"]}","/roles/index/perfilesrol/{$params}","Listado perfiles");
		$nav->agregar_navegacion("Editar perfil :: {$Rol["nombrerol"]}", "", "Editar perfil" );
		$this->view->placeholder("navegacion")->set($this->view->navegacion($nav));
		//Seteo de elementos del formulario
		$form->getElement("nombrerol")->setLabel("Nombre perfil:");
		$form->getElement("codpadre")->setValue($Rol["codpadre"]);
		//Validacion POST
		if ($this->getRequest()->isPost() && $form->isValid( $this->getRequest()->getPost () )) {
			try {
				if (count($arreglo_seleccionados)==0) {
					throw new Exception("Seleccione por lo menos una funcionalidad para este rol");
				}
				$roles->guardarRol( $form->getValues () );
				$this->view->priorityMessenger("Los datos se han guardado correctamente","success");
			
				//Esto agrega los padres de los perfiles seleccionados
				$arr_codpadres = array ();
				$arr_base = $arreglo_seleccionados;
				$seccionfuncional = new Roles_Model_Seccionfuncional ( );
				foreach ( $arreglo_seleccionados as $indice => $codigo ) {
					$seccionfuncional->arregloPadres ( $codigo, $arr_codpadres );
					$arr_base = array_merge ( $arr_base, $arr_codpadres );
				}
				$arreglo_seleccionados = array_unique ( $arr_base );
				//Se guardan los perfiles seleccionados
				$Perfilrol->guardarPerfilRol ( $codrol, $arreglo_seleccionados );
				
			} catch (Exception $e) {
				$this->view->priorityMessenger($e->getMessage(),"error");
			}
		} else {
			$datos = $roles->cargarDatos ( $codrol );
			$form->populate ( $datos );
		}
		$this->view->form = $form;
		$this->_helper->viewRenderer->setRender("crearperfil");
	}
	
	public function eliminarperfilAction() {
		$codrol = $this->_getParam ( 'codrol' );
		$codrolelim = $this->_getParam ( 'codrolelim' );
		$Roles = new Roles_Model_Roles();
		$Roles->eliminar($codrolelim);
		$params=App_Util_SafeUrl::encriptar(array("codrol"=>$codrol));
		$this->_helper->redirector( "perfilesrol","index","roles",$params);
	}
	
	public function funcionalidadesperfilAction(){
		$codrol = $this->_getParam ( 'codrol' );
		//Instanciacion de clases a usar en el controlador
		$roles 		= new Roles_Model_Roles ( );
		$Rol = $roles->getRol($codrol);
		//Barra de Navegacion
		$params=App_Util_SafeUrl::encriptar(array("codrol"=>$codrol),true);
		$RolPadre = $roles->getRol($Rol["codpadre"]);
		$paramsPadre=App_Util_SafeUrl::encriptar(array("codrol"=>$Rol["codpadre"]),true);
		$nav = new App_Util_Navegacion ( );
		$nav->agregar_navegacion("Listado de roles", "/roles/index/lista","Listado de roles");
		$nav->agregar_navegacion("Listado perfiles :: {$RolPadre["nombrerol"]}","/roles/index/perfilesrol/{$paramsPadre}","Listado perfiles");
		$nav->agregar_navegacion("Editar perfil :: {$Rol["nombrerol"]}", "/roles/index/modificarperfil/{$params}", "Editar perfil" );
		$nav->agregar_navegacion("Permisos del perfil", "", "Permisos del perfil" );
		$this->view->placeholder("navegacion")->set($this->view->navegacion($nav));
		$this->view->codrol=$codrol;
		$SeccionFuncional = new Roles_Model_Seccionfuncional();
		//$this->view->arreglo=$SeccionFuncional->getArreglo($codrol);
		$this->view->asignacionFuncionalidadesRol=$SeccionFuncional->asignacionFuncionalidadesRol($codrol);
	}
	
	public function asignarpermisosAction(){
		if ($this->getRequest()->isPost()) {
			$codrol = $this->_getParam ( 'codrol' );//Llega por POST a traves de un hidden
			$SeccionFuncional = new Roles_Model_Seccionfuncional();
			$Perfilrol 	= new Roles_Model_Perfilrol ( );
			$funcionalidadesOpcionesPorRol=$SeccionFuncional->getFuncionalidadesOpcionesPorRol($codrol);
			$acciones = array("ver","crear","modificar","eliminar");
			$arr_asignar = array();
			foreach ($funcionalidadesOpcionesPorRol as $codfunc) {
				foreach ($acciones as $accion) {
					$tmp = $this->_getParam("{$accion}_{$codfunc}");
					if (!empty($tmp)) {
						$arr_asignar[$codfunc][] = $accion;
					}
				}
			}
			try {
				if (count($arr_asignar)==0) {
					throw new Exception("Seleccione por lo menos un permiso a asignar");
				}
				$Perfilrol->guardarPermisosRol($codrol,$arr_asignar);
				$this->view->priorityMessenger("Los datos se han guardado correctamente.", "success");
				$params=App_Util_SafeUrl::encriptar(array("codrol"=>$codrol));
				$this->_helper->redirector( "funcionalidadesperfil","index","roles",$params);
			} catch (Exception $e) {
				$this->view->priorityMessenger($e->getMessage(),"error");
			}
		}
	}
		
}